package com.ruoyi.web.controller.tool.designpattern.structuralPatterns.decorator;

/**
 * 装饰者模式
 *
 * @author Hack2003
 * @date 2024/3/20 15:48
 **/
// 组件接口
interface Component {
    void operation();
}

// 具体组件
class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("旧组件具体操作内容.");
    }
}

// 装饰器
abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    public void operation() {
        component.operation();
    }
}

// 具体装饰器
class ConcreteDecorator extends Decorator {
    //原来的对象传进去
    public ConcreteDecorator(Component component) {
        super(component);
    }

    //原来的输出不变，加上新的输出
    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("添加新组件操作内容.");
    }
}

/**
 * 装饰器模式常用于需要动态地扩展对象功能的场景，
 * 例如在不修改现有代码的情况下，为对象添加新的功能或行为。
 */
public class Test {
    public static void main(String[] args) {
        //原来的输出
        Component component = new ConcreteComponent();
        component.operation();
        //原来的交给新的，会输出原来的和新的
        Component decoratedComponent = new ConcreteDecorator(new ConcreteComponent());
        decoratedComponent.operation();
    }
}